#ifndef _SYS_TEST_H_
#define _SYS_TEST_H_

#include "FanObj.h"
#include "SysTypes.h"

#define TEST_VTABLE(self)   ((TestVTable*)((FanObj*)self)->vtable)


extern Type*    Test_classType;
extern VTable*  Test_classVTable;


/* [sys::Test] Attributes */
struct Test
{
  FanObj        super;
};


/* [sys::Test] Virtual-table */
typedef struct TestVTable
{
  FanObjVTable  super;
  void          (*setup)(Test* self);
  void          (*teardown)(Test* self);
} TestVTable;


/* [sys::Test] Methods and fields */
void            Test_make(Test* self);
Method*         Test_curTestMethod(Test* self);
void            Test_setup(Test* self);
void            Test_teardown(Test* self);
void            Test_verify_1(Test* self, Bool cond);
void            Test_verify(Test* self, Bool cond, Str* msg);
void            Test_verifyFalse_1(Test* self, Bool cond);
void            Test_verifyFalse(Test* self, Bool cond, Str* msg);
void            Test_verifyNull_1(Test* self, NullableObj a);
void            Test_verifyNull(Test* self, NullableObj a, Str* msg);
void            Test_verifyNotNull_1(Test* self, NullableObj a);
void            Test_verifyNotNull(Test* self, NullableObj a, Str* msg);
void            Test_verifyEq_2(Test* self, NullableObj a, NullableObj b);
void            Test_verifyEq(Test* self, NullableObj a, NullableObj b, Str* msg);
void            Test_verifyNotEq_2(Test* self, NullableObj a, NullableObj b);
void            Test_verifyNotEq(Test* self, NullableObj a, NullableObj b, Str* msg);
void            Test_verifySame_2(Test* self, NullableObj a, NullableObj b);
void            Test_verifySame(Test* self, NullableObj a, NullableObj b, Str* msg);
void            Test_verifyNotSame_2(Test* self, NullableObj a, NullableObj b);
void            Test_verifyNotSame(Test* self, NullableObj a, NullableObj b, Str* msg);
void            Test_verifyType(Test* self, Obj obj, Type* t);
void            Test_verifyErr(Test* self, Type* errType, Func* c);
void            Test_fail_0(Test* self);
void            Test_fail(Test* self, Str* msg);
File*           Test_tempDir(Test* self);


/* [sys::Test] Type-system functions */
Type*           Test_initType(void);
VTable*         Test_initVTable(void);
void            Test_initStatic(void);


#endif
